package com.atguigu.oss.service.Impl;

import com.atguigu.commonutils.R;
import com.atguigu.oss.service.OssService;
import com.atguigu.oss.utill.ConstantPropertiesUtils;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Objects;
import java.util.UUID;


/**
 * @author: He Wentao
 * @date: 2022/8/19 22:55
 */
@Service
@Slf4j
public class OssServiceImpl implements OssService {
    // 密钥配置
    private static Auth auth;

    public OssServiceImpl(ConstantPropertiesUtils Properties) {
        auth = Auth.create(Properties.getAccess_key(), Properties.getSecret_key());
    }


    // 上传文件到 oss
    @Override
    public R uploadFileAvatar(MultipartFile file) {

        // 获取到文件后缀
        String suffix = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));

        // 判断文件后缀格式，是否为图片
        if (!".png".equals(suffix) && !".jpg".equals(suffix) && !".gif".equals(suffix) && !".tif".equals(suffix))
            return R.error().message("非法文件后缀");

        // 根据日期格式，生成目录
        String datePath = new DateTime().toString("yyyy/MM/dd");

        // 使用uuid，生成文件名
        String fileName = UUID.randomUUID().toString().replaceAll("-", "")  + suffix;

        // 拼接完整保存路径
        String savaPath = datePath+fileName;

        // 获取到要上传的数据
        byte[] data = null;

        try {
            data = file.getBytes();
        } catch (Exception ex) {
            return R.error().message(ex.getMessage());
        }

        // 进行文件上传
        return savaAvatar(savaPath, data);


    }

    @Override
    public R deleteAvatar(String url) {
       return delete(url);
    }

    /**
     * 文件上传方法
     *
     * @param savaPath 图片名
     * @param data     二进制图片数据
     * @return URL
     */
    private R savaAvatar(String savaPath, byte[] data) {
        // 创建配置类，设置区域为 北美 Region.regionNa0()
        Configuration cfg = new Configuration(Region.regionNa0());
        // 设置为 http
        cfg.useHttpsDomains = false;
        // 使用配置类
        UploadManager uploadManager = new UploadManager(cfg);

        // 设置保存的空间名
        String upToken = auth.uploadToken("oss-hai");

        try {
            // 进行上传
            Response response = uploadManager.put(data, savaPath, upToken);

            //解析上传成功的结果，这里可以使用一个自定义的对象，来接收返回值，也可以使用他默认的 DefaultPutRet
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

            // 返回 url
            return R.ok().data("url",ConstantPropertiesUtils.DOMAIN + putRet.key);

        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());

            return R.error().message("上传失败，请稍后重试");
        }
    }

    /**
     * 根据图片地址，删除图片
     * @param url 图片地址
     * @return 删除结果
     */
    private R delete(String url){
        // 创建配置类，设置区域为 北美 Region.regionNa0()
        Configuration cfg = new Configuration(Region.regionNa0());
        // 设置为 http
        cfg.useHttpsDomains = false;

        // 创建空间管理器
        BucketManager bucketManager = new BucketManager(auth, cfg);

        // 获取到储存位置  http://oss.hewentao.tk/img/388d03a0483245eaabd8695b1c7e5345.jpg
        String src= url.substring(ConstantPropertiesUtils.DOMAIN.length());

        try {
            bucketManager.delete(ConstantPropertiesUtils.BUCKET_NAME, src);
        } catch (QiniuException ex) {
            //如果遇到异常，说明删除失败
            R.error().coed(ex.code()).message(ex.response.toString());
        }

        return R.ok();
    }


}
